package com.example.demo.controller;
import cn.hutool.captcha.CaptchaUtil;
import cn.hutool.captcha.LineCaptcha;
import cn.hutool.captcha.generator.RandomGenerator;
import com.example.demo.config.PasswordUtils;
import com.example.demo.model.FriendMapper;
import com.example.demo.model.User;
import com.example.demo.model.UserMapper;
import org.mybatis.logging.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.*;

@RestController
public class UserController {

    LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(200, 100);

    @Autowired
    private FriendMapper friendMapper;

//    @Autowired
//    private CheckCodeTools codeTools;


    //实现注销
    @PostMapping("/logout")
    public void logout(HttpServletRequest req, HttpServletResponse res) throws IOException {
        HttpSession session = req.getSession(false);
        if(session != null){
            //注销当前会话
            session.invalidate();
        }
//        res.sendRedirect("/login.html");
    }

    @Autowired
    private UserMapper userMapper;
    @PostMapping("/login")
    @ResponseBody
    public Object login(String username, String password,
                        HttpServletRequest req,
                        HttpServletRequest request){
        //1.先去数据库查一下看用户名是否存在
        //  如果存在看密码是否匹配
        //2.如果都匹配,那么登录成功,需要创建会话.
        //  会话是为了记录当前的登录状态
       String imgText = request.getParameter("imgText");
//        String imgText = req.getParameter("imgText");
        User user = userMapper.selectByName(username);
        // 加盐解密
//        if (!PasswordUtils.decrypt(userinfoVO.getPassword(),userinfo.getPassword())) {
//            // 密码错误
//            return ResultAjax.fail(-2, "用户或密码错误！");
//        }
//        if(user == null || !user.getPassword().equals(password)){
//            //登录失败,同时返回一个空的对象
////            System.out.println("登录失败,用户名或者密码错误:"+user.toString());
//            return new User();
//        }
//        System.out.printf(imgText);
//        String ss = lineCaptcha.getCode();
//        System.out.printf(ss);
        Boolean b = imgText.equals(lineCaptcha.getCode());
        if(!b || user == null || !PasswordUtils.decrypt(password,user.getPassword())){
            //登录失败,同时返回一个空的对象
//            System.out.println(PasswordUtils.decrypt(password,user.getPassword()));
//            System.out.println(password);
//            System.out.println(user.getPassword());
//            System.out.println("登录失败,用户名或者密码错误:"+user.toString());
            //1表示验证码错误
            if(!b) return 1;
            //2表示账号或密码错误
            else return 2;
//            return new User();
        }
        //匹配成功的时候创建会话
        HttpSession session = req.getSession(true);
//                if (!PasswordUtils.decrypt(user.getPassword(),user.getPassword())) {
//            // 密码错误
//            return ResultAjax.fail(-2, "用户或密码错误！");
//        }
        //把数据库查到的对象保存在Attribute里面
        session.setAttribute("user",user);
        //为了防止密码不被返回,这里处理一下
        user.setPassword("");
//        return user;
        //3表示登录成功
        return 3;
    }
    @RequestMapping("/getCode")
    public void getCode(HttpServletResponse response) {
        // 随机生成 4 位验证码
        RandomGenerator randomGenerator = new RandomGenerator("0123456789", 4);
        // 定义图片的显示大小
        lineCaptcha = CaptchaUtil.createLineCaptcha(100, 40);
        response.setContentType("image/jpeg");
        response.setHeader("Pragma", "No-cache");
        try {
            // 调用父类的 setGenerator() 方法，设置验证码的类型
            lineCaptcha.setGenerator(randomGenerator);
            // 输出到页面
            lineCaptcha.write(response.getOutputStream());
            // 打印日志
//            logger.info("生成的验证码:{}", lineCaptcha.getCode());
            // 关闭流
            response.getOutputStream().close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }




    @PostMapping("/register")
    @Transactional
    @ResponseBody//表示返回一个数据,不是页面
    public Object register(String username,String password){
        User user = null;
        try {
            user = new User();
            user.setUsername(username);
            // 密码加盐
            user.setPassword(PasswordUtils.encrypt(password));
//            user.setPassword(password);
            //返回一个受影响的行数
            int ret = userMapper.insert(user);
            System.out.println("ret : "+ret);
            //主要捕获数据插入异常
        } catch (DuplicateKeyException e) {
//            e.printStackTrace();
            //如果捕获到该异常说明注册失败,那么返回一个空对象
            //我们new一个空对象让他返回
            user = new User();
        }
        //处理密码,不返回给前端页面
        user.setPassword("");
        return user;
    }

    //获取哪个用户登录
    @GetMapping("userInfo")
    @ResponseBody
    public Object GetUser(HttpServletRequest req){
        //1.从请求中获取对象,
        // false表示没有获取到会话也不会创建新的会话
        HttpSession session = req.getSession(false);
        if(session == null){
            //表示未获取到对象,也就是用户没有登录
            //此时返回一个空的对象就可以了
//            System.out.println("当前未获取到session对象");
            return new User();
        }
        //2.从会话中获取之前保存的对象
        User user = (User) session.getAttribute("user");
        //一般下面的情况不会真的存在,多判断一下总没有错
        if(user == null){
            System.out.println("当前未获取到session对象");
            return new User();
        }
        user.setPassword("");
        return user;
    }

//查找好友
    @PostMapping("/search")
    public List<User> searchUsers(String username) {
//        HttpSession session = req.getSession(false);

        if(username == ""){
            return new ArrayList<>();
        }
        List<User> users = userMapper.selectUsersListByName(username);
//        if(users.size() == 0){
//            return null;
//        }
//        model.addAttribute("friends", friends);
//        return users;
        return users;
    }
//验证码
/*
    @PostMapping("/getcode")
    public AjaxResult getCode(HttpServletRequest request) {
        String[] codeArr = codeTools.createImage();
        // 将验证码存储到 session
        HttpSession session = request.getSession();
        session.setAttribute(ApplicationVariable.SESSION_KEY_CHECK_CODE, codeArr[1]);
        return AjaxResult.success("/image/" + codeArr[0]);
    }
*/

    //换头像

    @RequestMapping("/changeAvatar")
    @ResponseBody
    public String changeAvatar(@RequestParam("avatar") MultipartFile avatar,HttpServletRequest req) {
        if (!avatar.isEmpty()) {
            try {
                // 保存头像文件到服务器
                String fileName = avatar.getOriginalFilename();
                String filePath = "/img/head/" + fileName; // 替换为实际保存路径
                File dest = new File(filePath);
                avatar.transferTo(dest);

                // 更新用户头像信息
                HttpSession session = req.getSession(false);
                User user = (User) session.getAttribute("user");
                int userId = user.getUserId();
//                int userId = 1; // 替换为实际用户ID
                String avatarUrl = "/img/head/" + fileName; // 替换为实际头像URL
                userMapper.updateAvatar(userId, avatarUrl);

                return "success";
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return "error";
    }
    //获取头像
    @GetMapping("/getUserAvatar")
    @ResponseBody
    public String getUserAvatar() {
        // 从数据库获取头像链接（这里假设从数据库获取的链接为 "http://example.com/avatar.jpg"）
        String avatarUrl = "http://example.com/avatar.jpg";
        return "{ \"avatar\": \"" + avatarUrl + "\" }";
    }
}
